package bdsimple.impl.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import bdsimple.abstractfactory.AbstractFactoryDAO;
import bdsimple.dao.base.CiudadDAO;
import bdsimple.dao.base.CiudadDistanciaDAO;
import bdsimple.dto.base.CiudadDTO;
import bdsimple.dto.base.CiudadDistanciaDTO;
import dao.base.api.IDTO;

public class CiudadDAOImpl extends MySQLBaseDAO implements CiudadDAO {

	public CiudadDAOImpl() {
		super(CiudadDTO.class);
	}

	@Override
	protected String createInsertCollst(IDTO dto) throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadDTOImpl.NOMBRE);
		strbuf.append(", ");
		strbuf.append(CiudadDTOImpl.DESCRIPCION);
		strbuf.append(", ");
		// strbuf.append(CiudadDTOImpl.IMAGEN);
		// strbuf.append(", ");
		strbuf.append(CiudadDTOImpl.PUNTOS_EXPERIENCIA);

		return strbuf.toString();

	}

	
	@Override
	protected String createInsertValues(IDTO dto) throws Exception {

		CiudadDTOImpl ciudadDTOImpl = (CiudadDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(singleQuotes(ciudadDTOImpl.getNombre()));
		strbuf.append(", ");
		strbuf.append(singleQuotes(ciudadDTOImpl.getDescripcion()));
		strbuf.append(", ");
		strbuf.append(ciudadDTOImpl.getPtosExperiencia());

		return strbuf.toString();

	}

	@Override
	protected String createTableColumns() throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadDTOImpl.ID);
		strbuf.append(" INT PRIMARY KEY AUTO_INCREMENT, ");
		strbuf.append(CiudadDTOImpl.NOMBRE);
		strbuf.append(" VARCHAR(50), ");
		strbuf.append(CiudadDTOImpl.DESCRIPCION);
		strbuf.append(" VARCHAR(200), ");
		strbuf.append(CiudadDTOImpl.PUNTOS_EXPERIENCIA);
		strbuf.append(" INT ");

		return strbuf.toString();

	}

	@Override
	protected String createUpdateValues(IDTO dto) throws Exception {

		CiudadDTOImpl ciudadDTOImpl = (CiudadDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadDTOImpl.NOMBRE);
		strbuf.append(" = ");
		strbuf.append(singleQuotes(ciudadDTOImpl.getNombre()));

		strbuf.append(", ");

		strbuf.append(CiudadDTOImpl.DESCRIPCION);
		strbuf.append(" = ");
		strbuf.append(singleQuotes(ciudadDTOImpl.getDescripcion()));

		strbuf.append(", ");

		strbuf.append(CiudadDTOImpl.PUNTOS_EXPERIENCIA);
		strbuf.append(" = ");
		strbuf.append(ciudadDTOImpl.getPtosExperiencia());

		return strbuf.toString();

	}

	@Override
	protected IDTO internalResultSetToDTO(ResultSet rs, IDTO dto)
			throws Exception {

		CiudadDTOImpl ret = (CiudadDTOImpl) dto;

		ret.setId(rs.getInt(CiudadDTOImpl.ID));
		ret.setNombre/*         */(rs.getString(CiudadDTOImpl.NOMBRE));
		ret.setDescripcion/*    */(rs.getString(CiudadDTOImpl.DESCRIPCION));
		ret.setPtosExperiencia/**/(rs.getInt(CiudadDTOImpl.PUNTOS_EXPERIENCIA));

		return ret;

	}

	// --------------------------------------------------------------------------------

	@Override
	public List<IDTO> listAll(int lim, int off) throws Exception {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		if (lim >= 0 && off >= 0) {
			strbuf.append(" LIMIT  ");
			strbuf.append(lim);
			strbuf.append(" OFFSET ");
			strbuf.append(off);
		}

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}

	// --------------------------------------------------------------------------------

	public List<IDTO> listBy(String key, Object val) //
			throws Exception {

		if (key == null || val == null) {
			throw new IllegalArgumentException("key == null || val == null");
		}

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(key);
		strbuf.append(" = ");
		strbuf.append(val);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}
	
	public byte[] loadImageByCiudadId(int ciudadId) throws SQLException {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT ");
        strbuf.append(CiudadDTO.IMAGEN);
        strbuf.append(" FROM ");
        strbuf.append(getTableName());
        strbuf.append(" WHERE ");
        strbuf.append(CiudadDTO.ID);
        strbuf.append(" = ");
        strbuf.append(ciudadId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        if (rs.next()) {
            return rs.getBytes(CiudadDTO.IMAGEN);
        }

        return null;
    }
	
	public void loadCiudadDistanciaDerList(CiudadDTO ciudadDO) throws Exception {
        checkCache(ciudadDO, CHECK_UPDATE);
        checkClass(ciudadDO, CiudadDTO.class, CHECK_UPDATE);

        CiudadDistanciaDAO ciudadDistanciaDAO = (CiudadDistanciaDAO) AbstractFactoryDAO.getFactoryDAO().getDAO( //
                CiudadDistanciaDAO.class, connectionBean);

        for ( CiudadDistanciaDTO item : ciudadDistanciaDAO.listByCiudadIzqId(ciudadDO.getId())) {
        	ciudadDO.getCiudadDistanciaDTOListObjetivo().add(item);
		}
    }

}
